package pe.gob.mininter.dirandro.vaadin.panel.mantenimiento;

import java.text.MessageFormat;
import java.util.List;
import java.util.Map;

import pe.gob.mininter.dirandro.model.Letrado;
import pe.gob.mininter.dirandro.model.Opcion;
import pe.gob.mininter.dirandro.model.Persona;
import pe.gob.mininter.dirandro.model.Valor;
import pe.gob.mininter.dirandro.service.LetradoService;
import pe.gob.mininter.dirandro.service.PersonaService;
import pe.gob.mininter.dirandro.util.BeanValidar;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.dialogs.AlertDialog;
import pe.gob.mininter.dirandro.vaadin.dialogs.ConfirmDialog;
import pe.gob.mininter.dirandro.vaadin.panel.util.PanelAgregarPersona;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.DirandroComponent;
import pe.gob.mininter.dirandro.vaadin.util.Injector;
import pe.gob.mininter.dirandro.vaadin.util.TablaFiltro;
import pe.gob.mininter.dirandro.vaadin.util.container.TablaFiltroIndexedContainer;
import pe.gob.mininter.dirandro.vaadin.util.container.TablaFiltroIndexedContainer.TipoComponente;
import pe.gob.mininter.dirandro.vaadin.util.event.TablaFiltroEnterEvent;
import pe.gob.mininter.dirandro.vaadin.util.listener.TablaFiltroEnterListener;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

public class PanelMantenLetrado extends DirandroComponent implements TablaFiltroEnterListener,ClickListener {
	
	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private HorizontalLayout pnlPrincipal;
	@AutoGenerated
	private VerticalLayout pnlDatos;
	@AutoGenerated
	private HorizontalLayout lytBotonera;
	@AutoGenerated
	private Button btnEliminar;
	@AutoGenerated
	private Button btnAgregar;
	@AutoGenerated
	private TextField txtColegiatura;
	@AutoGenerated
	private ComboBoxLOVS cmbTipo;
	@AutoGenerated
	private HorizontalLayout lytLetradoFila2;
	@AutoGenerated
	private Label lblDatosPersona;
	@AutoGenerated
	private HorizontalLayout lytLetradoFila1;
	@AutoGenerated
	private Button btnNuevo;
	@AutoGenerated
	private ComboBox cmbNombres;
	@AutoGenerated
	private Label lblLetrado;
	@AutoGenerated
	private VerticalLayout pnlLista;
	@AutoGenerated
	private TablaFiltro tblLetrados;
	@AutoGenerated
	private Label lblFiltro;
	private static final long serialVersionUID = -2300724647915630886L;
	
	private List<Persona> lstPersonas;
	private PanelAgregarPersona pnlAgregarPersona;
	private LetradoService letradoService;	
	private PersonaService personaService;
	private boolean flagNuevaEstado;
	private Long idLetrado;
	private Persona personaPopUp;

	private TablaFiltroIndexedContainer container;
	
	private static final String COLUMNA_LETRADO = "letrado";
	private static final String COLUMNA_PERSONA = "persona";
	private static final String COLUMNA_NOMBRE_COMPLETO = "persona.nombres";
	private static final String COLUMNA_TIPO = "tipo";
	private static final String COLUMNA_TIPO_NOMBRE = "tipo.nombre";
	private static final String COLUMNA_NRO_COLEGIATURA = "nro_colegiatura";
	
	public Persona getPersonaPopUp() {
		return personaPopUp;
	}

	public void setPersonaPopUp(Persona personaPopUp) {
		this.personaPopUp = personaPopUp;
	}
	
	public PanelMantenLetrado(List<Opcion> acciones, String height) {
		super(acciones, height);
		buildMainLayout();
		setCompositionRoot(mainLayout);
		letradoService = Injector.obtenerServicio(LetradoService.class);		
		personaService = Injector.obtenerServicio(PersonaService.class);
		postConstruct();
	}
	
	public void postConstruct() {
		
		btnNuevo.addListener((ClickListener)this);
		btnAgregar.addListener((ClickListener)this);
		btnEliminar.addListener((ClickListener)this);
		btnNuevo.setIcon(Constante.ICONOS.CREATE);

		cmbTipo.setCodigoLista(Constante.LISTA.CODIGO.TIPO_LETRADO);
		cmbTipo.setInputPrompt("Tipo de Letrado");
		
		lytLetradoFila2.setEnabled(false);
		lytLetradoFila2.setVisible(false);
		
		cargaLista();
		habilitarEdicion(false);
		
		container = new TablaFiltroIndexedContainer();
		container.addContainerProperty(COLUMNA_LETRADO, Letrado.class,  null);
		container.addContainerProperty(COLUMNA_PERSONA, Valor.class, null);
		container.addContainerProperty(COLUMNA_NOMBRE_COMPLETO, String.class, null,"Nombre",TipoComponente.TEXT,true,100);
		container.addContainerProperty(COLUMNA_TIPO, Valor.class, null);
		container.addContainerProperty(COLUMNA_TIPO_NOMBRE, String.class, null,"Tipo",TipoComponente.TEXT,true,100);
		container.addContainerProperty(COLUMNA_NRO_COLEGIATURA, String.class, null,"Nro Colegiatura",TipoComponente.TEXT,true,100);
		
		tblLetrados.setContainerDataSource(container);
		
		tblLetrados.setSelectable(true);
		tblLetrados.setImmediate(true);
		tblLetrados.setNullSelectionAllowed(true);
		tblLetrados.setNullSelectionItemId(null);
		tblLetrados.addListener((TablaFiltroEnterListener)this);
		tblLetrados.addListener(new ValueChangeListener() {
			
			private static final long serialVersionUID = 7962790507398071986L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				boolean esModoNuevo = tblLetrados.getValue() == null;
				limpiar();
				if(esModoNuevo){
					tblLetrados.setValue(null);
					habilitarEdicion(false);
					lytLetradoFila2.setVisible(false);
				}
				else{
					lytLetradoFila2.setVisible(true);
					habilitarEdicion(true);
					Item item = tblLetrados.getItem(tblLetrados.getValue());
					Letrado letrado=(Letrado)item.getItemProperty(COLUMNA_LETRADO).getValue();
					idLetrado = letrado.getId();
					txtColegiatura.setValue(letrado.getNroColegiatura());
					cmbTipo.select(letrado.getTipo());
					cmbNombres.select(letrado.getPersona());
				}
			}
		});	
		refrescar();
	}
	
	public void refrescar(){
		tblLetrados.setValue(null);
		habilitarEdicion(false);
		limpiar();
		buscarLetrados(null);
	}
	
	public void cargaLista(){
		lstPersonas = personaService.buscar(null);
		cmbNombres.setInputPrompt("Persona");
		cmbNombres.setItemCaptionPropertyId("nombreCompleto");
		cmbNombres.setImmediate(true);
		cmbNombres.setContainerDataSource(new BeanItemContainer<Persona>(Persona.class, lstPersonas));
		
		cmbNombres.addListener( new ValueChangeListener() {
			
			private static final long serialVersionUID = -6213576334461528840L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				lytLetradoFila2.setVisible(true);
				
				if(cmbNombres.getValue() != null){
					imprimirPersona((Persona)cmbNombres.getValue());
				}else{
					lblDatosPersona.setVisible(false);
				}
			}						
		});
	}
	
	private void habilitarEdicion(boolean flag){
		flagNuevaEstado = flag;
		if(flag){
			btnAgregar.setCaption("Actualizar");
			btnEliminar.setVisible(true);
		}
		else{
			btnAgregar.setCaption("Crear");
			btnEliminar.setVisible(false);
		}
	}
	
	private void buscarLetrados(Map<String, Object> map){
		Letrado letradoBuscar=null;
		if(map!=null){
			letradoBuscar=new Letrado();
			Persona persona=new Persona();
			persona.setNombres((String)map.get(COLUMNA_NOMBRE_COMPLETO));
			letradoBuscar.setPersona(persona);
			Valor tipo=new Valor();
			tipo.setNombre((String)map.get(COLUMNA_TIPO_NOMBRE));
			letradoBuscar.setTipo(tipo);
			letradoBuscar.setNroColegiatura((String)map.get(COLUMNA_NRO_COLEGIATURA));
		}
		List<Letrado> letrados=letradoService.buscar(letradoBuscar);
		container.removeAllItems();
		int con=1;
		for (Letrado letrado : letrados){
			Item item = container.addItem(con++);
			item.getItemProperty(COLUMNA_LETRADO).setValue(letrado);
			item.getItemProperty(COLUMNA_PERSONA).setValue(letrado.getPersona());
			item.getItemProperty(COLUMNA_NOMBRE_COMPLETO).setValue(letrado.getNombreCompleto());
			item.getItemProperty(COLUMNA_TIPO).setValue(letrado.getTipo());
			item.getItemProperty(COLUMNA_TIPO_NOMBRE).setValue(letrado.getTipo().getNombre());
			item.getItemProperty(COLUMNA_NRO_COLEGIATURA).setValue(letrado.getNroColegiatura());
		}
	}
	
	 public void obtenerDatosPersona() {
		 lstPersonas = personaService.buscar(null);
         cmbNombres.setContainerDataSource(new BeanItemContainer<Persona>(Persona.class, lstPersonas));
         cmbNombres.select(personaPopUp);
	 }
	 
	 private void imprimirPersona(Persona persona) {
		String plantilla = "<p><b>Tipo y Número de Documento:</b> {0} {1} <b>Nacionalidad:</b> {2} <b>Sexo:</b> {3}</p>";
		lblDatosPersona.setVisible(true);
		String sexoPersona = persona.getSexo().equals("M") ? "Masculino" : "Femenino";
		String html = MessageFormat.format(plantilla, persona.getTipoDocumento().getNombre(), persona.getNroDocumento(), persona.getNacionalidad().getNombre(), sexoPersona);
		lblDatosPersona.setValue(html);
	}
		
	private void cargarWindowPersona(Persona persona) {
		pnlAgregarPersona = new PanelAgregarPersona(this, persona);
		pnlAgregarPersona.setParent(this.getParent());
		
		final Window window=new Window(){
			
			private static final long serialVersionUID = 1L;

			protected void close() {
		    	getApplication().getMainWindow().removeWindow(getWindow());
			}
		};
		      
		window.setCaption("Registrar Persona");
		window.addComponent(pnlAgregarPersona);
		window.setModal(true);
		window.setResizable(false);
		window.setWidth("650px");
		window.setHeight("-1.0");
		getApplication().getMainWindow().addWindow(window);
		
	}
		
	@Override
	public void buttonClick(ClickEvent event) {
		
		if (event.getButton().equals(btnNuevo)) {
			cargarWindowPersona(new Persona());
		}else if (event.getButton().equals(btnAgregar)) {	
			StringBuilder sbContenido = new StringBuilder();
			Letrado letrado =  new Letrado();
			letrado.setPersona((Persona) cmbNombres.getValue());
			letrado.setTipo((Valor) cmbTipo.getValue());
			letrado.setNroColegiatura(txtColegiatura.getValue().toString());
			HarecUtil.validar(getWindow(), letrado, new BeanValidar[]{
				new BeanValidar("persona", new Object[]{"Persona"}, cmbNombres),
                new BeanValidar("tipo", new Object[]{"Tipo de letrado"}, cmbTipo),
                new BeanValidar("nroColegiatura", new Object[]{"Nro de Colegiatura"}, txtColegiatura)});
			if(flagNuevaEstado){
				letrado.setId(idLetrado);
				letradoService.actualizar(letrado);
				sbContenido.append("Letrado : ").append(letrado.getPersona().getNombreCompleto()).append(" se ha "+ Constante.OPERACION.ACTUALIZAR_REGISTRO+" satisfactoriamente.");
			}
			else{
				sbContenido.append("Letrado : ").append(letrado.getPersona().getNombreCompleto()).append(" se ha "+ Constante.OPERACION.CREAR_REGISTRO+" satisfactoriamente.");
				letradoService.crear(letrado);
			}
			
			AlertDialog alertDialog = new  AlertDialog("Letrado", sbContenido.toString(), "Aceptar", "400");
			getApplication().getMainWindow().addWindow(alertDialog);
			refrescar();
		}else if(event.getButton().equals(btnEliminar)){
			ConfirmDialog.show(getApplication().getMainWindow(), "¿Desea elimiar el registro?",new ConfirmDialog.Listener() {
				
				/**
				 * 
				 */
				private static final long serialVersionUID = 1193668370224762969L;

				@Override
				public void onClose(ConfirmDialog dialog) {
					if (dialog.isConfirmed()) {
						letradoService.eliminarXId(idLetrado);
						AlertDialog alertDialog = new  AlertDialog("Letrado", "Se eliminó correctamente el registro", "Aceptar", "400");
						getApplication().getMainWindow().addWindow(alertDialog);
						refrescar();
					}
				}
			});
		}
	}
	
	private void limpiar(){
		cmbNombres.select(null);
		cmbTipo.select(null);
		txtColegiatura.setValue("");
		idLetrado = null;
	}

	@Override
	public void handleEnterAction(TablaFiltroEnterEvent event) {
		buscarLetrados(event.getDatos());
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("-1px");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		mainLayout.setComponentAlignment(pnlPrincipal, new Alignment(20));
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new HorizontalLayout();
		pnlPrincipal.setStyleName("whiteBackGround");
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("-1px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(true);
		pnlPrincipal.setSpacing(true);
		
		// pnlLista
		pnlLista = buildPnlLista();
		pnlPrincipal.addComponent(pnlLista);
		
		// pnlDatos
		pnlDatos = buildPnlDatos();
		pnlPrincipal.addComponent(pnlDatos);
		pnlPrincipal.setComponentAlignment(pnlDatos, new Alignment(20));
		
		return pnlPrincipal;
	}

	@AutoGenerated
	private VerticalLayout buildPnlLista() {
		// common part: create layout
		pnlLista = new VerticalLayout();
		pnlLista.setImmediate(false);
		pnlLista.setWidth("460px");
		pnlLista.setHeight("300px");
		pnlLista.setMargin(false);
		
		// lblFiltro
		lblFiltro = new Label();
		lblFiltro.setStyleName("h2");
		lblFiltro.setImmediate(false);
		lblFiltro.setWidth("157px");
		lblFiltro.setHeight("-1px");
		lblFiltro.setValue("Filtro de Letrados");
		pnlLista.addComponent(lblFiltro);
		
		// tblLetrados
		tblLetrados = new TablaFiltro();
		tblLetrados.setImmediate(false);
		tblLetrados.setWidth("100.0%");
		tblLetrados.setHeight("100.0%");
		pnlLista.addComponent(tblLetrados);
		pnlLista.setExpandRatio(tblLetrados, 1.0f);
		
		return pnlLista;
	}

	@AutoGenerated
	private VerticalLayout buildPnlDatos() {
		// common part: create layout
		pnlDatos = new VerticalLayout();
		pnlDatos.setStyleName("h2");
		pnlDatos.setImmediate(false);
		pnlDatos.setWidth("-1px");
		pnlDatos.setHeight("-1px");
		pnlDatos.setMargin(false);
		pnlDatos.setSpacing(true);
		
		// lblLetrado
		lblLetrado = new Label();
		lblLetrado.setStyleName("h2");
		lblLetrado.setImmediate(false);
		lblLetrado.setWidth("187px");
		lblLetrado.setHeight("-1px");
		lblLetrado.setValue("Administración Letrado");
		pnlDatos.addComponent(lblLetrado);
		
		// lytLetradoFila1
		lytLetradoFila1 = buildLytLetradoFila1();
		pnlDatos.addComponent(lytLetradoFila1);
		
		// lytLetradoFila2
		lytLetradoFila2 = buildLytLetradoFila2();
		pnlDatos.addComponent(lytLetradoFila2);
		
		// cmbTipo
		cmbTipo = new ComboBoxLOVS();
		cmbTipo.setImmediate(false);
		cmbTipo.setWidth("-1px");
		cmbTipo.setHeight("-1px");
		pnlDatos.addComponent(cmbTipo);
		
		// txtColegiatura
		txtColegiatura = new TextField();
		txtColegiatura.setCaption("N° de Colegiatura");
		txtColegiatura.setImmediate(false);
		txtColegiatura.setWidth("150px");
		txtColegiatura.setHeight("-1px");
		txtColegiatura.setInputPrompt("Nro de Colegiatura");
		pnlDatos.addComponent(txtColegiatura);
		
		// lytBotonera
		lytBotonera = buildLytBotonera();
		pnlDatos.addComponent(lytBotonera);
		
		return pnlDatos;
	}

	@AutoGenerated
	private HorizontalLayout buildLytLetradoFila1() {
		// common part: create layout
		lytLetradoFila1 = new HorizontalLayout();
		lytLetradoFila1.setImmediate(false);
		lytLetradoFila1.setWidth("-1px");
		lytLetradoFila1.setHeight("-1px");
		lytLetradoFila1.setMargin(false);
		lytLetradoFila1.setSpacing(true);
		
		// cmbNombres
		cmbNombres = new ComboBox();
		cmbNombres.setCaption("Nombre Apellido Letrado");
		cmbNombres.setImmediate(false);
		cmbNombres.setWidth("230px");
		cmbNombres.setHeight("-1px");
		cmbNombres.setRequired(true);
		lytLetradoFila1.addComponent(cmbNombres);
		
		// btnNuevo
		btnNuevo = new Button();
		btnNuevo.setCaption(" ");
		btnNuevo.setImmediate(true);
		btnNuevo.setWidth("-1px");
		btnNuevo.setHeight("-1px");
		lytLetradoFila1.addComponent(btnNuevo);
		lytLetradoFila1.setComponentAlignment(btnNuevo, new Alignment(24));
		
		return lytLetradoFila1;
	}

	@AutoGenerated
	private HorizontalLayout buildLytLetradoFila2() {
		// common part: create layout
		lytLetradoFila2 = new HorizontalLayout();
		lytLetradoFila2.setImmediate(false);
		lytLetradoFila2.setWidth("-1px");
		lytLetradoFila2.setHeight("-1px");
		lytLetradoFila2.setMargin(false);
		lytLetradoFila2.setSpacing(true);
		
		// lblDatosPersona
		lblDatosPersona = new Label();
		lblDatosPersona.setImmediate(false);
		lblDatosPersona.setWidth("270px");
		lblDatosPersona.setHeight("50px");
		lblDatosPersona.setValue(" ");
		lblDatosPersona.setContentMode(3);
		lytLetradoFila2.addComponent(lblDatosPersona);
		
		return lytLetradoFila2;
	}

	@AutoGenerated
	private HorizontalLayout buildLytBotonera() {
		// common part: create layout
		lytBotonera = new HorizontalLayout();
		lytBotonera.setImmediate(false);
		lytBotonera.setWidth("-1px");
		lytBotonera.setHeight("-1px");
		lytBotonera.setMargin(true);
		lytBotonera.setSpacing(true);
		
		// btnAgregar
		btnAgregar = new Button();
		btnAgregar.setCaption("Agregar");
		btnAgregar.setImmediate(true);
		btnAgregar.setWidth("-1px");
		btnAgregar.setHeight("-1px");
		lytBotonera.addComponent(btnAgregar);
		
		// btnEliminar
		btnEliminar = new Button();
		btnEliminar.setCaption("Eliminar");
		btnEliminar.setImmediate(true);
		btnEliminar.setWidth("-1px");
		btnEliminar.setHeight("-1px");
		lytBotonera.addComponent(btnEliminar);
		
		return lytBotonera;
	}
	

}
